library(aspe)
library(tidyverse)
library(COGiter)
library(sf)
library(selectsp)
load(file = "../raw_data/tables_sauf_mei_2022_03_08_17_55_06.RData") # chargement autres tables
On utilise ici le package {tod} (pour Télécharger Open Data) qui permet d’accéder à divers jeux de données ouverts, dont les flux WGS du Sandre.
ag <- tod::wfs_sandre(url_wfs = "https://services.sandre.eaufrance.fr/geo/topage?",
couche = "BassinHydrographique") %>%
filter(LbBH == "Adour-Garonne") %>%
sf::st_buffer(dist = units::set_units(1, km)) # petit buffer pour ne rien manquer en limite
mapview::mapview(ag)
bv <- tod::wfs_sandre(url_wfs = "https://services.sandre.eaufrance.fr/geo/sandre",
couche = "SecteurHydro_FXX") %>%
filter(CdRegionHydro %in% c("O", "P", "Q", "R", "S"))
## Reading layer `SecteurHydro_FXX' from data source
## `https://services.sandre.eaufrance.fr/geo/sandre?service=wfs&version=2.0.0&request=GetCapabilities'
## using driver `WFS'
## Simple feature collection with 187 features and 6 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -5.141592 ymin: 41.36462 xmax: 9.559987 ymax: 51.08945
## Geodetic CRS: WGS 84
mapview::mapview(ag) +
mapview::mapview(bv, col.regions = "red")
Dans la base, les “points de prélèvement” et les “stations” sont géoréférencés. Il peut y avoir plusieurs points pour une même station. Une opération de pêche est toujours rattachée à un point mais un point n’est pas toujours rattaché à une station. On choisit donc de considérer les données ponctuelles à l’échelle du point.
On veut donc identifier les points qui sont dans le périmètre du bassin Adour-Garonne. Une difficulté vient de la nécessité d’homogénéiser les systèmes de coordonnées qui cohabitent dans la base ASPE. Les étapes sont :
dataframe
point_prelevementdataframe associant à chaque code point
ses coordonnées# ajout code EPSG
point_prelevement <- point_prelevement %>%
left_join(y = ref_type_projection,
by = c("pop_typ_id" = "typ_id"))
# dataframe des coordonnées (ici en epsg 4326 donc WGS84)
coords <- geo_convertir_coords_df(
df = point_prelevement,
var_x = pop_coordonnees_x,
var_y = pop_coordonnees_y,
var_id = pop_id,
var_crs_initial = typ_code_epsg,
crs_sortie = 4326
)
# ajout des coordonnées et conversion en objet de classe sf (spatial)
point_prelevement <- point_prelevement %>%
left_join(y = coords) %>%
st_as_sf(coords = c("X", "Y"),
crs = 4326)
# intersection géographique et collecte des identifiants des points sélectionnés
pops_ag <- point_prelevement %>%
st_join(ag) %>%
filter(LbBH == "Adour-Garonne") %>%
pull(pop_id)
Ici on opère les jointures entre les différentes tables de la base Aspe. Les relations sont de type 1 \(\rightarrow\) n et hiérarchisées dans l’ordre :
Les mesures individuelles étant, de loin, la table la plus volumineuse, on ne l’importe que si l’on en a besoin ce qui n’est pas le cas à ce stade où l’on se contente des lots.
La fonction mef_creer_passerelle() du package
{aspe} réalise ces jointures entre les indentifiants des
tables station à lot_poissons, ce qui permet
de filtrer la région sur les identifiants des points, après quoi on peut
ajouter d’autres informations à l’aide des fonctions préfixées
mef_.
ope_ag <- mef_creer_passerelle() %>% # mise en relation des identifiants des différentes tables
filter(pop_id %in% pops_ag) %>% # sélection des points en A-G
mef_ajouter_libelle() %>%
mef_ajouter_ope_date() %>%
mef_ajouter_lots()
NB : la fonction mef_ajouter_libelle() ajoute les
libellés des points. S’ils ne sont pas renseignés, c’est le libellé
station Sandre qui est renvoyé. Si les deux sont manquants c’est
l’identifiant du point pop_id.
On ajoute le protocole employé afin de pouvoir si besoin filtrer dessus, sélectionne les variables d’intérêt puis agrège les lots pour obtenir les effectifs par espèce pour chaque opération.
data <- ope_ag %>%
mef_ajouter_type_protocole() %>%
select(
sta_id,
pop_id,
pop_libelle,
ope_id,
ope_date,
pro_libelle,
annee,
esp_code_alternatif,
lop_id,
lop_effectif
) %>%
distinct() %>% # pour éviter doublons des opérations appartenant à plusieurs réseaux
group_by(sta_id,
pop_id,
pop_libelle,
ope_id,
ope_date,
pro_libelle,
annee,
esp_code_alternatif) %>%
summarise(effectif = sum(lop_effectif, n.rm = TRUE)) %>%
ungroup()
Pour chaque opération on calcule l’effectif de spirlin et des variables pour aider à l’interprétation.
ope_data <- data %>%
group_by(sta_id,
pop_id,
pop_libelle,
ope_id,
ope_date,
annee) %>%
summarise(eff_tot = sum(effectif, na.rm = TRUE), # effectif total capturé
nb_esp = n_distinct(esp_code_alternatif), # richesse en espèces
eff_spi = sum(effectif[esp_code_alternatif == "SPI"]) # effectif en spirlin
) %>%
mutate_at(vars(eff_tot:eff_spi),
replace_na,
replace = 0) %>%
mutate(eff_non_spi = eff_tot - eff_spi) %>% # effectif hors spirlin
relocate(eff_tot, .after = last_col()) %>%
ungroup()
On procède comme à l’opération sauf que l’agrégation est au point.
pop_data <- data %>%
group_by(sta_id, pop_id, pop_libelle) %>%
summarise(
nb_ope = n_distinct(ope_id), # nb d'opérations sur le pop
nb_ope_avec_spi = n_distinct(ope_id[esp_code_alternatif == "SPI"]), # nb d'opérations sur le pop avec SPI
nb_ope_ss_spi = nb_ope - nb_ope_avec_spi, # nb d'opérations sur le pop sans SPI
nb_esp = n_distinct(esp_code_alternatif), # richesse totale, toutes opérations confondues
pc_pres_spi = round(nb_ope_avec_spi / nb_ope, 2), # % des opérations où SPI était présent
annee_arrivee_spi = min(annee[esp_code_alternatif == "SPI"]) # année d'arrivée du SPI
) %>%
ungroup()
DT::datatable(pop_data)
La taille du point est en nombre d’opérations avec présence du Spirlin.
pop_map_data <- pop_data %>%
left_join(y = coords) %>%
st_as_sf(coords = c("X", "Y"), crs = 4326) %>%
filter(nb_ope_avec_spi > 0)
mapview::mapview(bv,
zcol = "LbSecteurHydro",
legend = FALSE,
alpha.regions = 0.05) +
mapview::mapview(x = pop_map_data,
cex = "nb_ope_avec_spi",
legend = TRUE)
ope_data %>%
group_by(annee) %>%
summarise(nb_pop_avec_spi = n_distinct(pop_id[eff_spi > 0])) %>%
ungroup() %>%
ggplot(aes(x = annee,
y = nb_pop_avec_spi)) +
geom_line() +
labs(x = "",
y = "Nombre de points avec du spirlin")
save(ope_data,
pop_data,
operation_ipr,
point_prelevement,
station,
data,
classe_ipr,
file = "../processed_data/spirlin_dfs.RData")